home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 1 Issue 2 / PDCD-1 - Issue 02.iso / _utilities / utilities / 003 / sox_2 / sox / c / avg < prev    next >
Text File  |  1994-06-05  |  3KB  |  153 lines

  1.  
  2. /*
  3.  * July 5, 1991
  4.  * Copyright 1991 Lance Norskog And Sundry Contributors
  5.  * This source code is freely redistributable and may be used for
  6.  * any purpose.  This copyright notice must be maintained. 
  7.  * Lance Norskog And Sundry Contributors are not responsible for 
  8.  * the consequences of using this software.
  9.  */
  10.  
  11. /*
  12.  * Sound Tools stereo/quad -> mono mixdown effect file.
  13.  *
  14.  * Does not mix up to more channels.
  15.  *
  16.  * What's in a center channel?
  17.  */
  18.  
  19. #include "st.h"
  20.  
  21. /* Private data for SKEL file */
  22. typedef struct avgstuff {
  23.     int    mix;            /* How are we mixing it? */
  24. } *avg_t;
  25.  
  26. #define MIX_CENTER    0
  27. #define MIX_LEFT    1
  28. #define MIX_RIGHT    2
  29.  
  30. /*
  31.  * Process options
  32.  */
  33. avg_getopts(effp, n, argv) 
  34. eff_t effp;
  35. int n;
  36. char **argv;
  37. {
  38.     avg_t avg = (avg_t) effp->priv;
  39.  
  40.     avg->mix = MIX_CENTER;
  41.     if (n) {
  42.         if(!strcmp(argv[0], "-l"))
  43.             avg->mix = MIX_LEFT;
  44.         else if (!strcmp(argv[0], "-r"))
  45.             avg->mix = MIX_RIGHT;
  46.              else
  47.             fail("Averaging effect takes options '-l' or '-r'.");
  48.     }
  49. }
  50.  
  51. /*
  52.  * Start processing
  53.  */
  54. void
  55. avg_start(effp)
  56. eff_t effp;
  57. {
  58.     switch (effp->outinfo.channels) {
  59.         case 1: switch (effp->ininfo.channels) {
  60.             case 2: 
  61.             case 4:
  62.                 return;
  63.         }
  64.         case 2: switch (effp->ininfo.channels) {
  65.             case 4:
  66.                 return;
  67.         }
  68.     }
  69.     fail("Can't average %d channels into %d channels",
  70.         effp->ininfo.channels, effp->outinfo.channels);
  71. }
  72.  
  73. /*
  74.  * Process either isamp or osamp samples, whichever is smaller.
  75.  */
  76.  
  77. avg_flow(effp, ibuf, obuf, isamp, osamp)
  78. eff_t effp;
  79. long *ibuf, *obuf;
  80. int *isamp, *osamp;
  81. {
  82.     avg_t avg = (avg_t) effp->priv;
  83.     int len, done;
  84.     
  85.     switch (effp->outinfo.channels) {
  86.         case 1: switch (effp->ininfo.channels) {
  87.             case 2:
  88.                 len = ((*isamp/2 > *osamp) ? *osamp : *isamp/2);
  89.                 for(done = 0; done < len; done++) {
  90.                     switch(avg->mix) {
  91.                         case MIX_CENTER:
  92.                         *obuf++ = ibuf[0]/2 + ibuf[1]/2;
  93.                         break;
  94.                         case MIX_LEFT:
  95.                         *obuf++ = ibuf[0];
  96.                         break;
  97.                         case MIX_RIGHT:
  98.                         *obuf++ = ibuf[1];
  99.                         break;
  100.                     }
  101.                     ibuf += 2;
  102.                 }
  103.                 *isamp = len * 2;
  104.                 *osamp = len;
  105.                 break;
  106.             case 4:
  107.                 len = ((*isamp/4 > *osamp) ? *osamp : *isamp/4);
  108.                 for(done = 0; done < len; done++) {
  109.                     *obuf++ = ibuf[0]/4 + ibuf[1]/4 +
  110.                         ibuf[2]/4 + ibuf[3]/4;
  111.                     ibuf += 4;
  112.                 }
  113.                 *isamp = len * 4;
  114.                 *osamp = len;
  115.                 break;
  116.                 
  117.         }
  118.         break;
  119.         case 2: switch (effp->ininfo.channels) {
  120.             /*
  121.              * After careful inspection of CSOUND source code,
  122.              * I'm mildly sure the order is:
  123.              *     front-left, front-right, rear-left, rear-right
  124.              */
  125.             case 4:
  126.                 len = ((*isamp/2 > *osamp) ? *osamp : *isamp/2);
  127.                 len &= ~1;
  128.                 for(done = 0; done < len; done++) {
  129.                     obuf[0] = ibuf[0]/2 + ibuf[2]/2;
  130.                     obuf[1] = ibuf[1]/2 + ibuf[3]/2;
  131.                     ibuf += 4;
  132.                     obuf += 2;
  133.                 }
  134.                 *isamp = len * 2;
  135.                 *osamp = len;
  136.                 break;
  137.         }
  138.     }
  139. }
  140.  
  141. /*
  142.  * Do anything required when you stop reading samples.  
  143.  * Don't close input file! 
  144.  *
  145.  * Should have statistics on right, left, and output amplitudes.
  146.  */
  147. avg_stop(effp)
  148. eff_t effp;
  149. {
  150.     /* nothing to do */
  151. }
  152.  
  153.